//package com.kingbook.common.lock;
//
//import com.kingbook.common.reflect.Reflections;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//import java.util.Map;
//
//import static java.math.BigDecimal.ZERO;
//
//
///**
// * @Author: Bucky
// * @Version 1.0
// */
//
//@Aspect
//@Component
//public class GlobalLockAspect {
//
//    private static Logger logger = LoggerFactory.getLogger(GlobalLockAspect.class);
//
//    @Around("@annotation(globalLock)")
//    private Object processValidate(ProceedingJoinPoint pjp, GlobalLock globalLock) throws Throwable {
//        String[] value = globalLock.value();
//        boolean withMethod = globalLock.withMethod();
//        MethodSignature signature = (MethodSignature) pjp.getSignature();
//        String method = pjp.getTarget().getClass().getSimpleName() + "." + signature.getName();
//        String key = withMethod ? ":" + method : "";
//        String v = "";
//        String[] pn = signature.getParameterNames();
//        Object[] obj = pjp.getArgs();
//
//        for (int i = 0; i < value.length; i++) {
//            boolean find = false;
//            for (int j = 0; j < pn.length; j++) {
//                if (value[i].equals(pn[j])) {
//                    v += ":" + obj[j];
//                    find = true;
//                    break;
//                }
//                if (obj[j] instanceof Map) {
//                    v += ":" + ((Map<?, ?>) obj[j]).get(value[i]);
//                    find = true;
//                    break;
//                } else if (Reflections.hasGetter(obj[j], value[i])) {
//                    v += ":" + Reflections.invokeGetter(obj[j], value[i]);
//                    find = true;
//                    break;
//                }
//            }
//            if (!find) {
//                logger.error("----> 无法找到GlobalLocks 变量值:{}", value[i]);
//            }
//        }
//        key = key + v;
//        try {
//            if (GlobalLocks.lock(key, method, 10)) {
//                return pjp.proceed();
//            }
//            return getReturnType(signature.getReturnType());
//        } catch (Exception e) {
//            throw e;
//        } finally {
//            GlobalLocks.unlock(key);
//        }
//    }
//
//    private Object getReturnType(Class clazz) {
//        try {
//            if (clazz.isArray()) {
//                throw new RuntimeException("----> 全局锁 不支持返回数组类型:" + clazz.getName());
//            }
//            switch (clazz.getName()) {
//                case "void":
//                    return null;
//                case "short":
//                case "float":
//                case "double":
//                case "byte":
//                case "int":
//                    return 0;
//                case "long":
//                    return 0L;
//                case "boolean":
//                    return false;
//                case "java.math.BigDecimal":
//                    return ZERO;
//                default:
//                    return clazz.newInstance();
//            }
//        } catch (InstantiationException | IllegalAccessException e) {
//            throw new RuntimeException("----> 全局锁 返回类型缺少默认构造器:" + clazz.getName(), e);
//        }
//    }
//
//
//}
